15513
530
Vad är den snabbaste metoden för att konvertera en java.nio.ByteBuffer a till en (nyligen skapad) CharBuffer b eller char [] b.
Genom att göra detta är det viktigt att a [i] == b [i]. Det betyder att inte a [i] och a [i + 1] tillsammans utgör ett värde b [j], vad getChar (i) skulle göra, men värdena bör "spridas".
byte a [] = {1,2,3, 125,126,127, -128, -127, -126} // vardera en byte (som är signerade)
char b [] = {1,2,3, 125,126,127, 128, 129, 130} // vardera en char (som är osignerade)
Observera att byte: -128 har samma (nedre 8) bitar som char: 128. Därför antar jag att den "bästa" tolkningen skulle vara som jag noterade ovan, eftersom bitarna är desamma.
Efter det behöver jag också vice versa-översättningen: Det mest effektiva sättet att få en char [] eller java.nio.CharBuffer tillbaka till en java.nio.ByteBuffer. 
Så vad du vill är att konvertera med hjälp av kodningen ISO-8859-1.
Jag hävdar ingenting om effektivitet, men det är åtminstone ganska kort att skriva:
CharBuffer-resultat = Charset.forName ("ISO-8859-1"). Avkoda (byteBuffer);
Den andra riktningen skulle vara:
ByteBuffer-resultat = Charset.forName ("ISO-8859-1"). Kod (charBuffer);
Vänligen mäta detta mot andra lösningar. (För att vara rättvis bör Charset.forName-delen inte inkluderas och ska också göras bara en gång, inte för varje buffert igen.)
Från Java 7 och vidare finns också StandardCharsets-klassen med förinstanserade Charset-instanser, så att du kan använda
CharBuffer-resultat = StandardCharsets.ISO_8859_1.decode (byteBuffer);
och
ByteBuffer-resultat = StandardCharsets.ISO_8859_1.encode (charBuffer);
istället. (Dessa rader gör samma sak som de tidigare, det är bara att leta upp och det finns ingen risk att skriva namnen fel och du behöver inte fånga omöjliga undantag.)
|
Jag instämmer med @ Ishtar's, föreslår att du inte ska konvertera till en ny struktur alls och bara konvertera efter behov.
Men om du har en hög ByteBuffer kan du göra.
ByteBuffer bb = ...
byte [] array = bb.array ();
char [] chars = new char [bb.remaining ()];
för (int i = 0; i